/***************************************************************************
 *                                 Poison.cs
 *                            -------------------
 *   begin                : May 1, 2002
 *   copyright            : (C) The RunUO Software Team
 *   email                : info@runuo.com
 *
 *   $Id: Poison.cs 511 2010-04-25 06:09:43Z mark $
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

using System;
using System.Collections;
using System.Collections.Generic;

namespace Server
{
	[Parsable]
	public abstract class Poison
	{
		/*public abstract TimeSpan Interval{ get; }
		public abstract TimeSpan Duration{ get; }*/
		public abstract string Name{ get; }
		public abstract int Level{ get; }
		public abstract Timer ConstructTimer( Mobile m );
		/*public abstract void OnDamage( Mobile m, ref object state );*/

		public override string ToString()
		{
			return this.Name;
		}


        private static List<Poison> m_Poisons = new List<Poison>();

		public static void Register( Poison reg )
		{
			string regName = reg.Name.ToLower();

			for(int i=0;i<m_Poisons.Count;i++)
			{
                if ( reg.Level == m_Poisons[i].Level )
					throw new Exception( "A poison with that level already exists." );
                else if ( regName == m_Poisons[i].Name.ToLower() )
					throw new Exception( "A poison with that name already exists." );
			}

			m_Poisons.Add( reg );
		}

		public static Poison Lesser{ get{ return GetPoison( "Lesser" ); } }
		public static Poison Regular{ get{ return GetPoison( "Regular" ); } }
		public static Poison Greater{ get{ return GetPoison( "Greater" ); } }
		public static Poison Deadly{ get{ return GetPoison( "Deadly" ); } }
		public static Poison Lethal{ get{ return GetPoison( "Lethal" ); } }

		#region Mondain's Legacy
		public abstract int RealLevel{ get; }
		public abstract int LabelNumber{ get; }

		public static Poison Parasitic{ get{ return GetPoison( "DeadlyParasitic" ); } }
		public static Poison Darkglow{ get{ return GetPoison( "GreaterDarkglow" ); } }
		#endregion

        public static List<Poison> Poisons
		{
			get
			{
				return m_Poisons;
			}
		}

		public static Poison Parse( string value )
		{
			Poison p = null;

            int plevel;

            if ( int.TryParse( value, out plevel ) )
                p = GetPoison( plevel );

			if ( p == null )
				p = GetPoison( value );

			return p;
		}

		public static Poison GetPoison( int level )
		{
			for ( int i = 0; i < m_Poisons.Count; ++i )
			{
                Poison p = m_Poisons[i];

				if ( p.Level == level )
					return p;
			}

			return null;
		}

		public static Poison GetPoison( string name )
		{
			for ( int i = 0; i < m_Poisons.Count; ++i )
			{
                Poison p = m_Poisons[i];

				if ( Utility.InsensitiveCompare( p.Name, name ) == 0 )
					return p;
			}

			return null;
		}

		public static void Serialize( Poison p, GenericWriter writer )
		{
			if ( p == null )
			{
				writer.Write( (byte)0 );
			}
			else
			{
				writer.Write( (byte)1 );
				writer.Write( (byte)p.Level );
			}
		}

		public static Poison Deserialize( GenericReader reader )
		{
			switch ( reader.ReadByte() )
			{
				case 1: return GetPoison( reader.ReadByte() );
				case 2: 
					//no longer used, safe to remove?
					reader.ReadInt();
					reader.ReadDouble();
					reader.ReadInt();
					reader.ReadTimeSpan();
					break;
			}
			return null;
		}
	}
}